/*生命游戏分步：
1.显示静止细胞图案
2.细胞繁衍和死亡的判定
3.更多功能实现
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>

#define High 25  // 定义游戏画面大小
#define Width 50

// 全局变量
int cells[High][Width]; // 所有位置细胞生1或死0
int s = 150;

void gotoxy(int x, int y)//类似于清屏函数
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle, pos);
}

void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info = { 1, 0 }; // 第二个值为0表示隐藏光标
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void startup() // 数据初始化
{
	int i, j;
	for (i = 0; i < High; i++) // 随机初始化
		for (j = 0; j < Width; j++)
		{
			cells[i][j] = rand() % 2;
		}
}

void show()  // 显示画面
{
	gotoxy(0, 0);  // 清屏
	int i, j;
	for (i = 1; i <= High; i++)
	{
		for (j = 0; j <= Width; j++)
		{
			if (cells[i][j] == 1)
				printf("*");  //   输出活的细胞
			else
				printf(" ");  //   输出空格			
		}
		printf("\n");
	}
	HideCursor(); // 隐藏光标

	Sleep(s);
}

void updateWithoutInput()  // 与用户输入无关的更新
{
	int i, j;
	int NeibourNumber;
	int temp[High][Width];
	for (i = 1; i < High; i++)
	{
		for (j = 1; j < Width; j++)
		{
			NeibourNumber = cells[i - 1][j - 1] + cells[i - 1][j] + cells[i - 1][j + 1] + cells[i][j - 1] + cells[i][j + 1] + cells[i + 1][j - 1] + cells[i + 1][j] + cells[i + 1][j + 1];
			if (NeibourNumber == 3) //周围有3个活细胞时，该细胞生
				temp[i][j] = 1;
			else if (NeibourNumber == 2) //周围有2个活细胞时，该细胞状态不变
				temp[i][j] = cells[i][j];
			else
				temp[i][j] = 0;
		}
	}
	for (i = 1; i < High; i++)
		for (j = 1; j < Width; j++)
			cells[i][j] = temp[i][j];
}

void main()
{
loop:
	startup();  // 数据初始化
	while (1) //  游戏循环执行
	{
		show();  // 显示画面
		updateWithoutInput();  // 与用户输入无关的更新
		char input;
		if (_kbhit())  // 判断是否有输入
		{
			input = _getch();  // 根据用户的不同输入来移动，不必输入回车
			if (input == 27)
				system("pause"); // 按下esc键暂停游戏，再次按任意键继续
			if (input == 'r')  // 按下r键重新开始
			{
				s = 150;
				goto loop;
			}
			if (input == 'a') // 按下a键减速游戏
				s += 25;
			if (input == 'd') // 按下d键加速游戏
			{
				s -= 25;
				if (s == 0)
					s = 25; // 防止Sleep函数异常
			}
		}
	}
}